package jp.co.toshiba.ffsa.action.csde;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.common.Crypto;
import jp.co.toshiba.ffsa.dto.LoginDto;
import jp.co.toshiba.ffsa.entity.System;
import jp.co.toshiba.ffsa.form.csde.Csde401Form;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.csde.Csde401Service;

import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;
import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ActionMessagesUtil;
import org.seasar.struts.util.MessageResourcesUtil;
import org.seasar.struts.util.RequestUtil;

/**
 * 設計I/F - 設計書アップロード
 * @author npc
 */
public class Csde401Action extends CommonAction{

    /** 画面ID */
    public String screenID = "CSDE401";

    /** 設計I/F - 設計書アップロード フォーム */
    @ActionForm
    @Resource
    protected Csde401Form csde401Form;

    /** 設計書アップロード画面 サービス */
    @ActionForm
    @Resource
    protected Csde401Service csde401Service;

    /** アップロードファイルリスト */
    public List<System> fileList = null;

    /** ファイルセットタイプ */
    public String filesetType;

    /**
     * 初期処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String index() throws Exception {

        try {
            // ログイン済判定する
            if( !judgeLogin(csde401Form.getSessionId()) ){
                return topTransition;
            }

            // リファラ判定
            if( !judgeRefferer() ){
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            // 詳細画面で選択されたワークフローで必要なアップロードファイルの一覧を取得
            csde401Service            = new Csde401Service();
            csde401Service.workflowId = csde401Form.workflowId;

            // システムマスタから内容を取得する。
            fileList = csde401Service.getFileList();

            // workflowId = 2 の場合、
            if(  MessageResourcesUtil.getMessage("csde401.007").equals(csde401Form.workflowId) ){
                // 上記に加え、File setの表示メッセージ取得
                csde401Service.projectId = csde401Form.projectId;

                // projectテーブルからFile setの設定値を取得
                csde401Service.getFilesetFromProject();

                // 取得したfileset_typeの名称をsystemテーブルから取得する
                csde401Service.getFilesetType();
                filesetType = csde401Service.filesetType;
            }

            // 機密情報を暗号化
            encryptSecretData();

            return "/csde/csde401.jsp";

        } catch (Exception e) {
            errorLogWriter(e, "index", screenID);
            throw e;
        }

    }

    @Execute(validator = true, input = "/csde/csde401/error")
    public String upload() throws Exception {

        // 遷移先
        String transition = "/csde/csde401";
        String result     = "";
        try {
            // ログイン済判定する
            if( !judgeLogin(csde401Form.getSessionId()) ){
                return topTransition;
            }

            // リファラ判定
            if( !judgeRefferer() ){
                return topTransition;
            }

            // 暗号化されていた機密情報を復号
            decryptSecretData();

            csde401Service = new Csde401Service();
            csde401Service.setUserId(((LoginDto)RequestUtil.getRequest().getSession().getAttribute("login_dto")).getUserID());
            csde401Service.projectId = csde401Form.projectId;
            csde401Service.revision  = csde401Form.revision;

            FormFile[] uploadFiles = csde401Form.uploadFiles;
            String[] workflowIds   = csde401Form.workflowIds;
            String[] systemId3s    = csde401Form.systemId3s;

            // ファイルチェックを行う
            int errorCount = 0;
            for (int i = 0; i < uploadFiles.length; i++) {
                FormFile file             = uploadFiles[i];
                csde401Service.workflowId = workflowIds[i];
                csde401Service.systemId3  = systemId3s[i];

                if(!csde401Service.checkFile(file)){
                    //エラー表示
                    ActionMessages messages = new ActionMessages();
                    if("csde401.901".equals(csde401Service.getErrorCode())){
                        // ファイル拡張子エラー
                        messages.add("uploadFailed", new ActionMessage(csde401Service.getErrorCode(), MessageResourcesUtil.getMessage("csde401.005"), csde401Service.fileNameExtension, true));
                    }else if ("csde401.902".equals(csde401Service.getErrorCode())){
                        // ファイルサイズエラー
                        messages.add("uploadFailed", new ActionMessage(csde401Service.getErrorCode(), MessageResourcesUtil.getMessage("csde401.006"), csde401Service.fileSize, true));
                    }else if ("csde401.903".equals(csde401Service.getErrorCode())){
                        // ファイルの存在
                        messages.add("uploadFailed", new ActionMessage("csde401.903", csde401Service.fileName, true));
                    }else if("errors.required".equals(csde401Service.getErrorCode())){
                        // ファイル空
                        messages.add("uploadFailed", new ActionMessage("errors.required", csde401Service.listTitle, true));
                    }else{
                        messages.add("uploadFailed", new ActionMessage(csde401Service.getErrorCode(), true));
                    }
                    ActionMessagesUtil.addErrors(RequestUtil.getRequest().getSession(true), messages);

                    result      = ConstantValue.fail;
                    errorCount += 1;

                }
            }

            // アップロード処理
            if(errorCount > 0){
                csde401Form.returnFlag = "0";
            }else{
                result                 = ConstantValue.success;
                csde401Form.returnFlag = "1";
                for (int i = 0; i < uploadFiles.length; i++) {
                    FormFile file             = uploadFiles[i];
                    csde401Service.workflowId = workflowIds[i];
                    csde401Service.systemId3  = systemId3s[i];

                    // ディレクトリ生成
                    csde401Service.makeDirs(file);

                    // アップロードされたデータを暗号化したファイルに書き出す
                    csde401Service.writeFile(file);

                    // ファイル情報存在チェック
                    if(csde401Service.checkAttachedFile()){
                        // ファイル情報が存在しない場合

                        // アップロードしたファイルの情報をattached_fileテーブルに登録
                        csde401Service.insertAttachedFile(file);
                    }else{
                        // ファイル情報が存在しない場合

                        // ファイル情報を更新
                        csde401Service.updateAttachedFile(file);
                    }

                    // 操作ログ記述

                    ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                    ArrayList<String> parameterNames = new ArrayList<String>();
                    ArrayList<String> values = new ArrayList<String>();
                    parameterNames.add(MessageResourcesUtil.getMessage("csde401.002"));
                    values.add(file.getFileName());
                    parameters.add(parameterNames);
                    parameters.add(values);
                    entryOperationHistory(screenID, "upload", parameters, result);
                }
            }

            // 機密情報を暗号化
            encryptSecretData();

            return transition;

        } catch (Exception e) {
            errorLogWriter(e, "upload", screenID);
            throw e;
        }


    }

    /**
     * バリデーションエラー処理
     * @return 遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String error() throws Exception {

        try {
            // ログイン済判定する
            if( !judgeLogin(csde401Form.getSessionId()) ){
                return topTransition;
            }

            // リファラ判定
            if( !judgeRefferer() ){
                return topTransition;
            }

            // セッションタイムアウト判定
            if( !judgeSession() ){
                return topTransition;
            }

            return index();

        }catch(Exception e) {
            errorLogWriter(e, "upload", screenID);
            throw e;
        }

    }

    private void encryptSecretData() throws Exception {
        csde401Form.projectId = Crypto.encrypt(csde401Form.projectId);
    }

    private void decryptSecretData() throws Exception {
        csde401Form.projectId = Crypto.decrypt(csde401Form.projectId);
    }

}